#ifndef __PID_H
#define __PID_H

typedef struct
{
  float kp, ki, kd;             // 三个系数
  float error, lastError;       // 误差，上次误差
  float integral, maxIntegral;  // 积分，积分限幅
  float output, maxOutput;      // 输出，输出限幅
}PID;

typedef struct
{
  PID inner;    // 速度环
  PID outer;    // 位置环
  float output; // 串联输出
}CascadePID;

extern CascadePID mypid;

// 用于初始化pid参数的函数
void PID_Init(PID *pid, float p, float i, float d, float maxI, float maxOut);

// 进行一次pid计算
// 参数为(pid结构体，目标值，反馈值)，计算结果放在pid结构体的output成员中
void PID_Calc(PID *pid, float reference, float feedback);

/**
 * @brief 串级PID
 * 
 * @param pid 
 * @param outerRef 
 * @param outerFdb 
 * @param innerFdb 
 */
void PID_CascadeCalc(CascadePID *pid, float outerRef, float outerFdb, float innerFdb);

#endif // !__PID_H
